package com.example.demo;

import com.example.demo.myinterface.Fruit;
import org.junit.Test;

import java.util.*;

public class TestDemo {
    /**
     * spi思想,  ServiceLoader打破双亲委派机制,强行用appclassloader类加载器加载 /META-INF/service下面定义
     * 的接口全路径命名的类.通过反射将路径下的所有实现类反射出来(为了加快后续访问速度,第一次反射生成后会将所有实现类放入缓存)
     * 可以跟进源码看  ps:ServiceLoader的370行  Class.forName反射
     * 344行的 PREFIX 属性,点进去看 路径是 META-INF/services/
     */
    @Test
    public void test202306020929() {
        ServiceLoader<Fruit> load = ServiceLoader.load(Fruit.class);
        Iterator<Fruit> iterator = load.iterator();
        while (iterator.hasNext()) {
            Fruit next = iterator.next();
            next.eat();
        }
    }

    /**
     * 测试策略模式
     */
    @Test
    public void test202306020945() {
        //String fruitName="苹果";//这里模仿的是苹果业务,可以换成别的
        String fruitName="橘子";
        ServiceLoader<Fruit> load = ServiceLoader.load(Fruit.class);
        Iterator<Fruit> iterator = load.iterator();
        List<Fruit> fruits = new ArrayList<>();
        while (iterator.hasNext()) {
            Fruit next = iterator.next();
            fruits.add(next);
        }
        for (Fruit f : fruits) {
            //不同策略切换点
            if (f.matchType(fruitName)) {
                f.eat();
            }
        }
    }


}
